﻿using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Managers.Properties;
using GDM.Hogar.Repositorios.Contratos;
using GDM.Hogar.Soporte;
using GDM.Hogar.Soporte.Helpers;
using System;
using System.Security.Authentication;

namespace GDM.Hogar.Managers
{
    public class LoginManager : ILoginManager
    {
        private readonly IUsuarioRepositorio _usuarioRepositorio;

        public LoginManager(IUsuarioRepositorio usuarioRepositorio)
        {
            if (usuarioRepositorio == null)
            {
                throw new ArgumentNullException("usuarioRepositorio");
            }
            _usuarioRepositorio = usuarioRepositorio;
        }

        public void Login(string nombreUsuario, string contraseña)
        {
            var success = false;

            if (ValidarUsuario(nombreUsuario, contraseña))
            {
                var usuario = _usuarioRepositorio.ObtenerUsuario(nombreUsuario);
                if (usuario != null)
                {
                    if (usuario.Activo && usuario.UsuarioId > 0)
                    {
                        success = true;
                        var contextoUsuario = new ContextoUsuario(usuario.UsuarioId, usuario.NombreUsuario, usuario.RolId, usuario.FechaUltimoIngreso);
                        ContextoUsuarioManager.Instancia.ContextoUsuario = contextoUsuario;
                    }
                    else
                    {
                        throw new AuthenticationException(Resources.UsuarioInvalido);
                    }
                }
            }

            if (!success)
            {
                throw new AuthenticationException(Resources.UsuarioOContraseñaInvalido);
            }
        }

        private bool ValidarUsuario(string nombreUsuario, string contraseña)
        {
            var usuario = _usuarioRepositorio.ObtenerUsuario(nombreUsuario);
            if (usuario == null)
            {
                return false;
            }
            var validacionExitosa = (usuario.Contraseña != null && Encriptador.VerificarContraseñaEncriptada(usuario.Contraseña, contraseña));
            return validacionExitosa;
        }
    }
}